// 这是一个高阶组件，用于判断用户是否登录，如果登录了则继续访问，否则去登录页面

import React, { Component } from "react";
import { Redirect } from "react-router-dom";
// 导入模型
import Model from "@/models/common";

function CheckLogin(Cmp) {
    // 返回一个新的组件
    return class Hoc extends Component {
        // 状态
        state = {
            isLogin: false,
            // 标志状态修改是否结束
            isFinish: false,
        };

        render() {
            // isFinish必须要为true，才让其走后面的三元，否则等下再走
            // {...this.props}：表示在HOC返回新组件的时候，携带传入组件的props，目的很简单，避免数据丢失
            return <>{this.state.isFinish ? this.state.isLogin ? <Cmp {...this.props} /> : <Redirect to="/login" /> : <div />}</>;
        }

        // 在生命周期中判断用户是否登录
        componentDidMount() {
            // 判断是否有token
            let jwt = localStorage.getItem("jwt");
            if (jwt) {
                // 有token，还需要向后台发送请求二次检验jwt是否正确
                Model.checkJWT().then((ret) => {
                    if (ret.errNo === 0) {
                        // jwt正常，可以继续访问
                        this.setState(() => {
                            return {
                                isLogin: true,
                                isFinish: true,
                            };
                        });
                    } else {
                        // jwt验证失败，回登录页面
                        this.setState(() => {
                            return {
                                isLogin: false,
                                isFinish: true,
                            };
                        });
                    }
                });
            } else {
                // 无token
                console.log("没有登录");
                this.setState(() => {
                    return {
                        isFinish: true,
                    };
                });
            }
        }
    };
}

export default CheckLogin;
